package com.example.smart_park2211a

import android.content.Context
import android.graphics.*
import android.util.AttributeSet
import android.view.View

/**
 *  @name:  陈慕青
 * 圆形倒计时视图类
 * 该类用于显示一个圆形的倒计时动画，可以通过设置progress和seconds来控制倒计时的进度和时间
 * @param context 上下文，用于创建视图
 * @param attrs 属性集，包含自定义视图的属性
 */
class CircleCountdownView @JvmOverloads constructor(
    context: Context, attrs: AttributeSet? = null
) : View(context, attrs) {

    /**
     * 倒计时进度，范围为1f到0f
     * 设置该值会触发视图重绘，以显示更新后的倒计时进度
     */
    var progress: Float = 1f // 1f~0f
        set(value) {
            field = value
            invalidate()
        }

    /**
     * 倒计时秒数
     *
     * 设置该值会触发视图重绘，以显示更新后的倒计时数字
     */
    var seconds: Int = 5
        set(value) {
            field = value
            invalidate()
        }

    // 用于绘制圆环的画笔，设置了抗锯齿，画笔样式为描边，描边宽度为4dp，颜色为白色
    private val paintCircle = Paint(Paint.ANTI_ALIAS_FLAG).apply {
        style = Paint.Style.STROKE
        strokeWidth = 4f * resources.displayMetrics.density // 由8dp改为4dp
        color = Color.WHITE
    }

    // 用于绘制倒计时数字的画笔，设置了抗锯齿，颜色为白色，文本大小为16sp，居中对齐，使用粗体字型
    private val paintText = Paint(Paint.ANTI_ALIAS_FLAG).apply {
        color = Color.WHITE
        textSize = 16f * resources.displayMetrics.scaledDensity // 适当减小文字
        textAlign = Paint.Align.CENTER
        typeface = Typeface.DEFAULT_BOLD
    }

    /**
     * 绘制视图的方法
     * 该方法负责绘制圆环和倒计时数字
     *
     * @param canvas 画布，用于绘制视图的内容
     */
    override fun onDraw(canvas: Canvas) {
        super.onDraw(canvas)
        // 计算圆环的半径和中心点坐标
        val radius = width.coerceAtMost(height) / 2f - paintCircle.strokeWidth
        val cx = width / 2f
        val cy = height / 2f
        // 画圆环
        val rect = RectF(cx - radius, cy - radius, cx + radius, cy + radius)
        canvas.drawArc(rect, -90f, 360 * progress, false, paintCircle)
        // 画倒计时数字
        val text = "${seconds}s"
        val fontMetrics = paintText.fontMetrics
        val baseLine = cy - (fontMetrics.ascent + fontMetrics.descent) / 2
        canvas.drawText(text, cx, baseLine, paintText)
    }
}
